package main

import (
	"fmt"
	"net"
	"net/url"
)

func main() {
	p := fmt.Println // 定义一个简短的打印函数

	s := "postgres://user:pass@host.com:5432/path?k=v#f" // 定义一个 URL 字符串

	// 使用 url.Parse 函数解析 URL 字符串 s
	// 它返回一个 *url.URL 类型的指针 u 和一个 error 类型的值 err
	u, err := url.Parse(s)
	if err != nil {
		p(err) // 如果解析出错，则打印错误信息
	}

	// 打印 URL 的 Scheme (协议) 部分
	p("Scheme:", u.Scheme) // Output: Scheme: postgres

	// 打印 URL 的 Userinfo 部分，它包含了用户名和密码
	p("User:", u.User) // Output: User: user:pass

	// 使用 Userinfo 的 Username() 方法获取用户名
	p("Username:", u.User.Username()) // Output: Username: user

	// 使用 Userinfo 的 Password() 方法获取密码
	pwd, _ := u.User.Password() // Password() 方法返回密码和一个布尔值表示密码是否存在
	p("Password:", pwd)         // Output: Password: pass

	// 打印 URL 的 Host 部分，通常包含主机名和端口号
	p("Host:", u.Host) // Output: Host: host.com:5432

	// 使用 net.SplitHostPort 函数将 Host 分割成主机名和端口号
	host, port, _ := net.SplitHostPort(u.Host)
	p("Host:", host, "Port:", port) // Output: Host: host.com Port: 5432

	// 打印 URL 的 Path 部分
	p("Path:", u.Path) // Output: Path: /path

	// 打印 URL 的 Fragment 部分 (哈希 # 后面的部分)
	p("Fragment:", u.Fragment) // Output: Fragment: f

	// 打印 URL 的 RawQuery 部分 (问号 ? 后面的未解析的查询字符串)
	p("RawQuery:", u.RawQuery) // Output: RawQuery: k=v

	// 使用 url.ParseQuery 函数解析 RawQuery 字符串
	// 它返回一个 url.Values 类型的 map，map 的键是查询参数名，值是字符串切片
	m, _ := url.ParseQuery(u.RawQuery)
	p("Parsed Query:", m) // Output: Parsed Query: map[k:[v]]

	// 访问解析后的查询参数 "k" 的第一个值
	p("Value of k:", m["k"][0]) // Output: Value of k: v
}